<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
    <title>ShellCheck: SC2157 – Argument to implicit `-n` is always true due to literal strings.</title>
    <link rel="stylesheet" href="css/bootstrap.min.css" />
  </head>
  <body style="margin-left: auto; margin-right: auto; max-width: 800px">
    <h1>SC2157 – ShellCheck Wiki</h1>
    <a href="https://github.com/koalaman/shellcheck/wiki/SC2157">See this page on GitHub</a>
    <p style="display: none"><a href="index.html">Sitemap</a></p>
    <hr />
    <h2
id="argument-to-implicit--n-is-always-true-due-to-literal-strings">Argument
to implicit <code>-n</code> is always true due to literal strings.</h2>
<p>(Or: Argument to -z is always false due to literal strings. )</p>
<h3 id="problematic-code">Problematic code:</h3>
<div class="sourceCode" id="cb1"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb1-1"><a href="SC2157.html#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="bu">[</span> <span class="st">&quot;</span><span class="va">$foo</span><span class="st"> &quot;</span> <span class="bu">]</span></span>
<span id="cb1-2"><a href="SC2157.html#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="cf">then</span></span>
<span id="cb1-3"><a href="SC2157.html#cb1-3" aria-hidden="true" tabindex="-1"></a>  <span class="bu">echo</span> <span class="st">&quot;this is always true because of the trailing space&quot;</span></span>
<span id="cb1-4"><a href="SC2157.html#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span></code></pre></div>
<h3 id="correct-code">Correct code:</h3>
<div class="sourceCode" id="cb2"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb2-1"><a href="SC2157.html#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="bu">[</span> <span class="st">&quot;</span><span class="va">$foo</span><span class="st">&quot;</span> <span class="bu">]</span></span>
<span id="cb2-2"><a href="SC2157.html#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="cf">then</span></span>
<span id="cb2-3"><a href="SC2157.html#cb2-3" aria-hidden="true" tabindex="-1"></a>  <span class="bu">echo</span> <span class="st">&quot;correctly checks value&quot;</span></span>
<span id="cb2-4"><a href="SC2157.html#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span></code></pre></div>
<h3 id="rationale">Rationale:</h3>
<p>Since <code>[ str ]</code> and <code>[ -n str ]</code> check that the
string is non-empty, any literal characters in the string -- including a
space character like in the example -- will cause the test to always be
true.</p>
<p>Equivalently, since <code>[ -z str ]</code> checks that the string is
empty, any literal character in the string will cause the test to always
be false.</p>
<p>Double check the string: you may have added trailing characters, or
bad quotes or syntax. Some examples include:</p>
<ul>
<li><code>[ "$foo " ]</code> like in the example, where the space
becomes part of the string</li>
<li><code>[ "{$foo}" ]</code> instead of <code>[ "${foo}" ]</code>,
where the <code>{</code> becomes part of the string</li>
<li><code>[ "$foo -gt 0" ]</code> instead of
<code>[ "$foo" -gt "0" ]</code>, where the <code>-gt</code> becomes part
of the string</li>
</ul>
<h3 id="exceptions">Exceptions:</h3>
<p>None.</p>
    <hr />
    <p style='font-size: 80%'><a href="../index.html">ShellCheck</a> is a static analysis tool for shell scripts. This page is part of its documentation.</p>
  </body>
</html>


